home *** CD-ROM | disk | FTP | other *** search
Wrap
CCCCCCCCFFFFFFFFTTTT2222DDDD((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTT2222DDDD((((3333SSSS)))) NNNNAAAAMMMMEEEE CCCCCCCCFFFFFFFFTTTT2222DDDD, ZZZZZZZZFFFFFFFFTTTT2222DDDD - Applies a two-dimensional complex-to-complex Fast Fourier Transform (FFT) SSSSYYYYNNNNOOOOPPPPSSSSIIIISSSS Single precision complex -> Single precision complex Fortran: CCCCAAAALLLLLLLL CCCCCCCCFFFFFFFFTTTT2222DDDD ((((_i_s_i_g_n,,,, _n_1,,,, _n_2,,,, _s_c_a_l_e,,,, _x,,,, _l_d_x,,,, _y,,,, _l_d_y,,,, _t_a_b_l_e,,,, _w_o_r_k,,,, _i_s_y_s)))) C/C++: ####iiiinnnncccclllluuuuddddeeee <<<<ssssccccssssllll____fffffffftttt....hhhh>>>> iiiinnnntttt ccccccccfffffffftttt2222dddd ((((iiiinnnntttt _i_s_i_g_n,,,, iiiinnnntttt _n_1,,,, iiiinnnntttt _n_2,,,, ffffllllooooaaaatttt _s_c_a_l_e,,,, ssssccccssssllll____ccccoooommmmpppplllleeeexxxx *_x,,,, iiiinnnntttt _l_d_x,,,, ssssccccssssllll____ccccoooommmmpppplllleeeexxxx *_y,,,, iiiinnnntttt _l_d_y,,,, ffffllllooooaaaatttt *_t_a_b_l_e,,,, ffffllllooooaaaatttt *_w_o_r_k,,,, iiiinnnntttt *_i_s_y_s))));;;; C++ STL: ####iiiinnnncccclllluuuuddddeeee <<<<ccccoooommmmpppplllleeeexxxx....hhhh>>>> ####iiiinnnncccclllluuuuddddeeee <<<<ssssccccssssllll____fffffffftttt....hhhh>>>> iiiinnnntttt ccccccccfffffffftttt2222dddd ((((iiiinnnntttt _i_s_i_g_n,,,, iiiinnnntttt _n_1,,,, iiiinnnntttt _n_2,,,, ffffllllooooaaaatttt _s_c_a_l_e,,,, ccccoooommmmpppplllleeeexxxx<<<<ffffllllooooaaaatttt>>>> *_x,,,, iiiinnnntttt _l_d_x,,,, ccccoooommmmpppplllleeeexxxx<<<<ffffllllooooaaaatttt>>>> *_y,,,, iiiinnnntttt _l_d_y,,,, ffffllllooooaaaatttt *_t_a_b_l_e,,,, ffffllllooooaaaatttt *_w_o_r_k,,,, iiiinnnntttt *_i_s_y_s))));;;; Double precision complex -> Double precision complex Fortran: CCCCAAAALLLLLLLL ZZZZZZZZFFFFFFFFTTTT2222DDDD ((((_i_s_i_g_n,,,, _n_1,,,, _n_2,,,, _s_c_a_l_e,,,, _x,,,, _l_d_x,,,, _y,,,, _l_d_y,,,, _t_a_b_l_e,,,, _w_o_r_k,,,, _i_s_y_s)))) C/C++: ####iiiinnnncccclllluuuuddddeeee <<<<ssssccccssssllll____fffffffftttt....hhhh>>>> iiiinnnntttt zzzzzzzzfffffffftttt2222dddd ((((iiiinnnntttt _i_s_i_g_n,,,, iiiinnnntttt _n_1,,,, iiiinnnntttt _n_2,,,, ddddoooouuuubbbblllleeee _s_c_a_l_e,,,, ssssccccssssllll____zzzzoooommmmpppplllleeeexxxx *_x,,,, iiiinnnntttt _l_d_x,,,, ssssccccssssllll____zzzzoooommmmpppplllleeeexxxx *_y,,,, iiiinnnntttt _l_d_y,,,, ddddoooouuuubbbblllleeee *_t_a_b_l_e,,,, ddddoooouuuubbbblllleeee *_w_o_r_k,,,, iiiinnnntttt *_i_s_y_s))));;;; C++ STL: ####iiiinnnncccclllluuuuddddeeee <<<<ccccoooommmmpppplllleeeexxxx....hhhh>>>> ####iiiinnnncccclllluuuuddddeeee <<<<ssssccccssssllll____fffffffftttt....hhhh>>>> iiiinnnntttt zzzzzzzzfffffffftttt2222dddd ((((iiiinnnntttt _i_s_i_g_n,,,, iiiinnnntttt _n_1,,,, iiiinnnntttt _n_2,,,, ddddoooouuuubbbblllleeee _s_c_a_l_e,,,, ccccoooommmmpppplllleeeexxxx<<<<ddddoooouuuubbbblllleeee>>>> *_x,,,, iiiinnnntttt _l_d_x,,,, ccccoooommmmpppplllleeeexxxx<<<<ddddoooouuuubbbblllleeee>>>> *_y,,,, iiiinnnntttt _l_d_y,,,, ddddoooouuuubbbblllleeee *_t_a_b_l_e,,,, ddddoooouuuubbbblllleeee *_w_o_r_k,,,, iiiinnnntttt *_i_s_y_s))));;;; IIIIMMMMPPPPLLLLEEEEMMMMEEEENNNNTTTTAAAATTTTIIIIOOOONNNN These routines are part of the SCSL Scientific Library and can be loaded using either the ----llllssssccccssss or the ----llllssssccccssss____mmmmpppp option. The ----llllssssccccssss____mmmmpppp option directs the linker to use the multi-processor version of the library. When linking to SCSL with ----llllssssccccssss or ----llllssssccccssss____mmmmpppp, the default integer size is 4 bytes (32 bits). Another version of SCSL is available in which integers are 8 bytes (64 bits). This version allows the user access to larger memory sizes and helps when porting legacy Cray codes. It can be loaded PPPPaaaaggggeeee 1111 CCCCCCCCFFFFFFFFTTTT2222DDDD((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTT2222DDDD((((3333SSSS)))) by using the ----llllssssccccssss____iiii8888 option or the ----llllssssccccssss____iiii8888____mmmmpppp option. A program may use only one of the two versions; 4-byte integer and 8-byte integer library calls cannot be mixed. The C and C++ prototypes shown above are appropriate for the 4-byte integer version of SCSL. When using the 8-byte integer version, the variables of type iiiinnnntttt become lllloooonnnngggg lllloooonnnngggg and the <<<<ssssccccssssllll____fffffffftttt____iiii8888....hhhh>>>> header file should be included. DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN These routines compute the two-dimensional complex Fast Fourier Transform (FFT) of the complex matrix _X, and store the results in the complex matrix _Y. In FFT applications, it is customary to use zero-based subscripts; the formulas are simpler that way. Suppose that the arrays are declared as follows: Fortran: COMPLEX X(0:ldx-1, 0:n2-1) COMPLEX Y(0:ldx-1, 0:n2-1) C/C++: scsl_complex x[n2][ldx], y[n2][ldy]; C++ STL: complex<float> x[n2][ldx], y[n2][ldy]; where _l_d_x >= _n_1, _l_d_y >= _n_1. These conventions are used in the following equation: Y(k1,k2) = Yk, k j1 or j2 = j or j These routines compute the formula: n1-1 n2-1 (j1 * k1) (j2 * k2) Y(k1,k2) = scale * Sum Sum [X(j1, j2)*w1 * w2 ] j1=0 j2=0 PPPPaaaaggggeeee 2222 CCCCCCCCFFFFFFFFTTTT2222DDDD((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTT2222DDDD((((3333SSSS)))) for _k_1 = 0 ... _n_1-1 _k_2 = 0 ... _n_2-1 where: _w_1 = exp(_i_s_i_g_n*2*_p_i*_i/_n_1) _w_2 = exp(_i_s_i_g_n*2*_p_i*_i/_n_2) _i = + sqrt(-1) _p_i = 3.14159... _i_s_i_g_n = +1 or -1 Different authors use different conventions for which of the transforms, _i_s_i_g_n = +1 or _i_s_i_g_n = -1, is the forward or inverse transform, and what the _s_c_a_l_e factor should be in either case. You can make this routine compute any of the various possible definitions, however, by choosing the appropriate values for _i_s_i_g_n and _s_c_a_l_e. The relevant fact from FFT theory is this: If you take the FFT with any particular values of _i_s_i_g_n and _s_c_a_l_e, the mathematical inverse function is computed by taking the FFT with -_i_s_i_g_n and 1/(_n_1*_n_2*_s_c_a_l_e). In particular, if you use _i_s_i_g_n = +1 and _s_c_a_l_e = 1.0 for the forward FFT, you can compute the inverse FFT by using _i_s_i_g_n = -1 and _s_c_a_l_e = 1.0/(_n_1*_n_2). See the NOTES section of this man page for information about the interpretation of the data types described in the following arguments. These routines have the following arguments: _i_s_i_g_n Integer. (input) Specifies whether to initialize the _t_a_b_l_e array or to do the forward or inverse transform as follows: If _i_s_i_g_n = 0, the routine initializes the _t_a_b_l_e array and returns. In this case, the only arguments used or checked are _i_s_i_g_n, _n_1, _n_2, _t_a_b_l_e. If _i_s_i_g_n = +1 or -1, the value of _i_s_i_g_n is the sign of the exponent used in the FFT formula. _n_1 Integer. (input) Transform size in the first dimension. If _n_1 is not positive, the routine returns without performing a transform. _n_2 Integer. (input) Transform size in the second dimension. If _n_2 is not positive, the routine returns without performing a transform. PPPPaaaaggggeeee 3333 CCCCCCCCFFFFFFFFTTTT2222DDDD((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTT2222DDDD((((3333SSSS)))) _s_c_a_l_e Scale factor. (input) CCCCCCCCFFFFFFFFTTTT2222DDDD: Single precision. ZZZZZZZZFFFFFFFFTTTT2222DDDD: Double precision. Each element of the output array is multiplied by _s_c_a_l_e factor after taking the Fourier transform, as defined previously. _x Array of dimensions (_l_d_x, _n_2). (input) CCCCCCCCFFFFFFFFTTTT2222DDDD: Complex single precision array. ZZZZZZZZFFFFFFFFTTTT2222DDDD: Double precision complex array. Input array of values to be transformed. _l_d_x Integer. (input) The number of rows in the _x array, as it was declared in the calling program (the leading dimension of _x). _l_d_x >= MMMMAAAAXXXX(_n_1, 1). _y Array of dimension (_l_d_y, _n_2). (output) CCCCCCCCFFFFFFFFTTTT2222DDDD: Single precision complex array. ZZZZZZZZFFFFFFFFTTTT2222DDDD: Double precision complex array. Output array of transformed values. The output array may be the same as the input array, in which case, the transform is done in place (the input array is overwritten with the transformed values). In this case, it is necessary that _l_d_x = _l_d_y. _l_d_y Integer. (input) The number of rows in the _y array, as it was declared in the calling program (the leading dimension of _y). _l_d_y >= MMMMAAAAXXXX(_n_1, 1). _t_a_b_l_e Array of dimension (2*_n_1 + _N_F) + (2*_n_2 + _N_F). (input or output) CCCCCCCCFFFFFFFFTTTT2222DDDD: Single precision array. ZZZZZZZZFFFFFFFFTTTT2222DDDD: Double precision array. Table of factors and roots of unity. See the description of the _i_s_y_s argument for the value of _N_F. If _i_s_i_g_n = 0, the routine initializes _t_a_b_l_e (_t_a_b_l_e is output only). If _i_s_i_g_n = +1 or -1, the values in _t_a_b_l_e are assumed to be initialized already by a prior call with _i_s_i_g_n = 0 (_t_a_b_l_e is input only). _w_o_r_k Array of dimension 2 * MMMMAAAAXXXX((((_n_1,,,, _n_2)))) CCCCCCCCFFFFFFFFTTTT2222DDDD: Single precision array. ZZZZZZZZFFFFFFFFTTTT2222DDDD: Double precision array. Work array. This is a scratch array used for intermediate calculations. Its address space must be different from that of the input and output arrays. PPPPaaaaggggeeee 4444 CCCCCCCCFFFFFFFFTTTT2222DDDD((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTT2222DDDD((((3333SSSS)))) _i_s_y_s Integer array dimensioned 0000........_i_s_y_s((((0000)))). An array that gives implementation-specific information. All features and functions of the FFT routines specific to any particular implementation are confined to this _i_s_y_s array. In the Origin series implementation, _i_s_y_s((((0000))))====0000 and _i_s_y_s((((0000))))====1111 are supported. In SCSL versions prior to 1.3, only _i_s_y_s((((0000))))====0000 was allowed. For _i_s_y_s((((0000))))====0000, _N_F====33330000, and for _i_s_y_s((((0000))))====1111, _N_F====222255556666. The _N_F words of storage in the _t_a_b_l_e array contain a factorization of the length of the transform. The smaller value of _N_F for _i_s_y_s((((0000))))====0000 is historical. It is too small to store all the required factors for the highest performing FFT, so when _i_s_y_s((((0000))))====0000, extra space is allocated when the _t_a_b_l_e array is initialized. To avoid memory leaks, this extra space must be deallocated when the _t_a_b_l_e array is no longer needed. The CCCCCCCCFFFFFFFFTTTT2222DDDDFFFF routine is used to release this memory. Due to the potential for memory leaks, the use of _i_s_y_s((((0000))))====0000 should be avoided. For _i_s_y_s((((0000))))====1111, the value of _N_F is large enough so that no extra memory needs to be allocated, and there is no need to call CCCCCCCCFFFFFFFFTTTT2222DDDDFFFF to release memory. If called, it does nothing. NOTE: _i_s_y_s((((0000))))====1111 means that _i_s_y_s is an integer array with two elements. The second element, _i_s_y_s((((1111)))), will not be accessed. NNNNOOOOTTTTEEEESSSS The following data types are described in this documentation: TTTTeeeerrrrmmmm UUUUsssseeeedddd DDDDaaaattttaaaa ttttyyyyppppeeee Fortran: Array dimensioned 0000........_n----1111 xxxx((((0000::::nnnn----1111)))) Array of dimensions (_m,_n) xxxx((((mmmm,,,,nnnn)))) Array of dimensions (_m,_n,_p) xxxx((((mmmm,,,,nnnn,,,,pppp)))) IIIInnnntttteeeeggggeeeerrrr IIIINNNNTTTTEEEEGGGGEEEERRRR (IIIINNNNTTTTEEEEGGGGEEEERRRR****8888 for ----llllssssccccssss____iiii8888[[[[____mmmmpppp]]]]) Single precision RRRREEEEAAAALLLL Double precision DDDDOOOOUUUUBBBBLLLLEEEE PPPPRRRREEEECCCCIIIISSSSIIIIOOOONNNN Single precision complex CCCCOOOOMMMMPPPPLLLLEEEEXXXX Double precision complex DDDDOOOOUUUUBBBBLLLLEEEE CCCCOOOOMMMMPPPPLLLLEEEEXXXX PPPPaaaaggggeeee 5555 CCCCCCCCFFFFFFFFTTTT2222DDDD((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTT2222DDDD((((3333SSSS)))) C/C++: Array dimensioned 0000........_n----1111 xxxx[[[[_n]]]] Array of dimensions (_m,_n) xxxx[[[[mmmm****nnnn]]]] oooorrrr xxxx[[[[nnnn]]]][[[[mmmm]]]] Array of dimensions (_m,_n,_p) xxxx[[[[mmmm****nnnn****pppp]]]] oooorrrr xxxx[[[[pppp]]]][[[[nnnn]]]][[[[mmmm]]]] Integer iiiinnnntttt (lllloooonnnngggg lllloooonnnngggg for ----llllssssccccssss____iiii8888[[[[____mmmmpppp]]]]) Single precision ffffllllooooaaaatttt Double precision ddddoooouuuubbbblllleeee Single precision complex ssssccccssssllll____ccccoooommmmpppplllleeeexxxx Double precision complex ssssccccssssllll____zzzzoooommmmpppplllleeeexxxx C++ STL: Array dimensioned 0000........_n----1111 xxxx[[[[_n]]]] Array of dimensions (_m,_n) xxxx[[[[mmmm****nnnn]]]] oooorrrr xxxx[[[[nnnn]]]][[[[mmmm]]]] Array of dimensions (_m,_n,_p) xxxx[[[[mmmm****nnnn****pppp]]]] oooorrrr xxxx[[[[pppp]]]][[[[nnnn]]]][[[[mmmm]]]] Integer iiiinnnntttt (lllloooonnnngggg lllloooonnnngggg for ----llllssssccccssss____iiii8888[[[[____mmmmpppp]]]]) Single precision ffffllllooooaaaatttt Double precision ddddoooouuuubbbblllleeee Single precision complex ccccoooommmmpppplllleeeexxxx<<<<ffffllllooooaaaatttt>>>> Double precision complex ccccoooommmmpppplllleeeexxxx<<<<ddddoooouuuubbbblllleeee>>>> CCCCAAAAUUUUTTTTIIIIOOOONNNNSSSS Transform sizes with a prime factor exceeding 22223332222----1111 are not supported for the 8-byte integer version of the library. In addition to the _w_o_r_k array, the FFT routines also dynamically allocate scratch space from the stack. The amount of space allocated can be slightly bigger than the size of the largest processor cache. For single processor runs, the default stack size is large enough that these allocations generally cause no problems. But for parallel runs, you need to ensure that the stack size of slave threads is big enough to hold this scratch space. Failure to reserve sufficient stack space will cause programs to dump core due to stack overflows. The stack size of MP library slave threads is controlled via the MMMMPPPP____SSSSLLLLAAAAVVVVEEEE____SSSSTTTTAAAACCCCKKKKSSSSIIIIZZZZEEEE environment variable or the mmmmpppp____sssseeeetttt____ssssllllaaaavvvveeee____ssssttttaaaacccckkkkssssiiiizzzzeeee(((()))) library routine. See the mmmmpppp(3C), mmmmpppp(3F) and ppppeeee____eeeennnnvvvviiiirrrroooonnnn(5) reference pages for more information on controlling the slave stack size. For pthreads applications, the PPPPaaaaggggeeee 6666 CCCCCCCCFFFFFFFFTTTT2222DDDD((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTT2222DDDD((((3333SSSS)))) thread's stack size is specified as one of many creation attributes provided in the pthread_attr_t argument to pppptttthhhhrrrreeeeaaaadddd____ccccrrrreeeeaaaatttteeee(3P). The stacksize attribute should be set explicitly to a non-default value using the pppptttthhhhrrrreeeeaaaadddd____aaaattttttttrrrr____sssseeeettttssssttttaaaacccckkkkssssiiiizzzzeeee(3P) call, described in the pppptttthhhhrrrreeeeaaaadddd____aaaattttttttrrrr____iiiinnnniiiitttt(3P) man page. Care must be exercised if copies of the _t_a_b_l_e array are used: even though a copy exists, the original must persist. As an example, the following code will nnnnooootttt work: #include <scsl_fft.h> scsl_complex x[256][129], y[256][129]; float table[(2*128 + 256) + (2*256 + 256)]; float work[2*256]; int isys[2]; isys[0] = 1; { float table_orig[(2*128 + 256) + (2*256 + 256)]; ccfft2d(0, 128, 256, 1.0f, (scsl_complex *) x, 129, 129, (scsl_complex *) y, table_orig, work, isys); bcopy(table_orig, table, ((2*128+256)+(2*256+256))*sizeof(float)); } ccfft2d(1, 128, 256, 1.0f, (scsl_complex *) x, 129, (scsl_complex *) y, 129, table, work, isys); In this example, because _t_a_b_l_e__o_r_i_g is a stack variable that does not persist outside of the code block delimited by the braces, the data in the copy, _t_a_b_l_e, are not guaranteed to be valid. However, the following code will work because _t_a_b_l_e__o_r_i_g is persistent: #include <scsl_fft.h> scsl_complex x[256][129], y[256][129]; float table_orig[(2*128 + 256) + (2*256 + 256)]; float table[(2*128 + 256) + (2*256 + 256)]; float work[2*256]; int isys[2]; isys[0] = 1; ccfft2d(0, 128, 256, 1.0f, (scsl_complex *) x, 129, (scsl_complex *) y, 129, table_orig, work, isys); bcopy(table_orig, table, ((2*128+256)+(2*256+256))*sizeof(float)); ccfft2d(1, 128, 256, 1.0f, (scsl_complex *) x, 129, (scsl_complex *) y, 129, table, work, isys); EEEEXXXXAAAAMMMMPPPPLLLLEEEESSSS All examples here are for Origin series only. Example 1: Initialize the TTTTAAAABBBBLLLLEEEE array in preparation for doing a two- dimensional FFT of size 128 by 256. In this case only the _i_s_i_g_n, _n_1, _n_2, and _t_a_b_l_e arguments are used; you can use dummy arguments or zeros for PPPPaaaaggggeeee 7777 CCCCCCCCFFFFFFFFTTTT2222DDDD((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTT2222DDDD((((3333SSSS)))) other arguments. Fortran: REAL TABLE ((2*128 + 256) + (2*256 + 256)) INTEGER ISYS(0:1) ISYS(0) = 1 CALL CCFFT2D (0, 128, 256, 0.0, DUMMY, 1, DUMMY, 1, & TABLE, DUMMY, ISYS) C/C++: #include <scsl_fft.h> float table[(2*128 + 256) + (2*256 + 256)]; int isys[2]; isys[0] = 1; ccfft2d(0, 128, 256, 0.0f, NULL, 1, NULL, 1, table, NULL, isys); C++ STL: #include <complex.h> #include <scsl_fft.h> float table[(2*128 + 256) + (2*256 + 256)]; int isys[2]; isys[0] = 1; ccfft2d(0, 128, 256, 0.0f, NULL, 1, NULL, 1, table, NULL, isys); Example 2: _X and _Y are complex arrays dimensioned (0..128, 0..255). The first 128 elements of each column contain data. For performance reasons, the extra element forces the leading dimension to be an odd number. Take the two-dimensional FFT of _X and store it in _Y. Initialize the _t_a_b_l_e array, as in example 1. Fortran: COMPLEX X(0:128, 0:255) COMPLEX Y(0:128, 0:255) REAL TABLE((2*128 + 256) + (2*256 + 256)) REAL WORK 2*MAX(128,256) INTEGER ISYS(0:1) ISYS(0) = 1 CALL CCFFT2D(0, 128, 256, 1.0, X, 129, Y, 129, & TABLE, WORK, ISYS) CALL CCFFT2D(1, 128, 256, 1.0, X, 129, Y, 129, & TABLE, WORK, ISYS) PPPPaaaaggggeeee 8888 CCCCCCCCFFFFFFFFTTTT2222DDDD((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTT2222DDDD((((3333SSSS)))) C/C++: #include <scsl_fft.h> scsl_complex x[256][129], y[256][129]; float table[(2*128 + 256) + (2*256 + 256)]; float work[2*256]; int isys[2]; isys[0] = 1; ccfft2d(0, 128, 256, 1.0f, (scsl_complex *) x, 129, (scsl_complex *) y, 129, table, work, isys); ccfft2d(1, 128, 256, 1.0f, (scsl_complex *) x, 129, (scsl_complex *) y, 129, table, work, isys); C++ STL: #include <complex.h> #include <scsl_fft.h> complex<float> x[256][129], y[256][129]; float table[(2*128 + 256) + (2*256 + 256)]; float work[2*256]; int isys[2]; isys[0] = 1; ccfft2d(0, 128, 256, 1.0f, (complex<float> *) x, 129, (complex<float> *) y, 129, table, work, isys); ccfft2d(1, 128, 256, 1.0f, (complex<float> *) x, 129, (complex<float> *) y, 129, table, work, isys); Example 3: With _X and _Y as in example 2, take the inverse FFT of _Y and store it back in _X. The scale factor 1/(128*256) is used. Assume that the _t_a_b_l_e array is already initialized. Fortran: CALL CCFFT2D(-1, 128, 256, 1.0/(128.0*256.0), Y, 129, & X, 129, TABLE, WORK, ISYS) C/C++: ccfft2d(-1, 128, 256, 1.0f/(128.0f*256.0f), (scsl_complex *) y, 129, (scsl_complex *) x, 129, table, work, isys); C++ STL: ccfft2d(-1, 128, 256, 1.0f/(128.0f*256.0f), (complex<float> *) y, 129, (complex<float> *) x, 129, table, work, isys); PPPPaaaaggggeeee 9999 CCCCCCCCFFFFFFFFTTTT2222DDDD((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTT2222DDDD((((3333SSSS)))) Example 4: Perform the same computation as in example 2, but put the output back in array _X to save storage space. Use the 8-byte integer version of SCSL. Fortran: COMPLEX X(0:128, 0:255) REAL TABLE((2*128 + 256) + (2*256 + 256)) REAL WORK(2*256) INTEGER*8 ISYS(0:1) ISYS(0) = 1_8 CALL CCFFT2D(0_8, 128_8, 256_8, 1.0, X, 129_8, X, 129_8, & TABLE, WORK, ISYS) CALL CCFFT2D(1_8, 128_8, 256_8, 1.0, X, 129_8, X, 129_8, & TABLE, WORK, ISYS) C/C++: #include <scsl_fft_i8.h> scsl_complex x[256][129]; float table[(2*128 + 256) + (2*256 + 256)]; float work[2*256]; long long isys[2]; isys[0] = 1LL; ccfft2d(0LL, 128LL, 256LL, 1.0f, (scsl_complex *) x, 129LL, (scsl_complex *) x, 129LL, table, work, isys); C++ STL: #include <complex.h> #include <scsl_fft_i8.h> complex<float> x[256][129]; float table[(2*128 + 256) + (2*256 + 256)]; float work[2*256]; long long isys[2]; isys[0] = 1LL; ccfft2d(0LL, 128LL, 256LL, 1.0f, (complex<float> *) x, 129LL, (complex<float> *) x, 129LL, table, work, isys); Example 5: Perform the same computation as in example 2, but assume that the lower bound of each Fortran array is 1, rather than 0. The subroutine calls are not changed. Fortran: COMPLEX X(129, 256) COMPLEX Y(129, 256) CALL CCFFT2D(0, 128, 256, 1.0, X, 129, Y, 129, TABLE, WORK, 0) CALL CCFFT2D(1, 128, 256, 1.0, X, 129, Y, 129, TABLE, WORK, 0) PPPPaaaaggggeeee 11110000 CCCCCCCCFFFFFFFFTTTT2222DDDD((((3333SSSS)))) CCCCCCCCFFFFFFFFTTTT2222DDDD((((3333SSSS)))) SSSSEEEEEEEE AAAALLLLSSSSOOOO IIIINNNNTTTTRRRROOOO____SSSSCCCCSSSSLLLL(3S), IIIINNNNTTTTRRRROOOO____FFFFFFFFTTTT(3S), CCCCCCCCFFFFFFFFTTTT(3S), CCCCCCCCFFFFFFFFTTTT3333DDDD(3S), CCCCCCCCFFFFFFFFTTTTMMMM(3S), SSSSCCCCFFFFFFFFTTTT(3S), SSSSCCCCFFFFFFFFTTTT2222DDDD(3S), SSSSCCCCFFFFFFFFTTTT3333DDDD(3S), SSSSCCCCFFFFFFFFTTTTMMMM(3S) PPPPaaaaggggeeee 11111111